package com.springjooq.sdun.config.core.shiro;

import cn.stylefeng.roses.core.util.ToolUtil;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.ByteSource;

/**
 * @Description shiro util
 * @auther Szper
 * @create 2019-08-30 09:25
 */
public class ShiroKit {

    private static final String NAMES_DELIMETER = ",";

    /**
     * 加密码盐参数
     */
    public final static String hashAlgorithmName = "MD5";
    /**
     * 迭代次数
     */
    public final static int hashIterations = 1024;

    /**
     * shiro密码加密工具
     * @param credentials 密码
     * @param saltSource 密码盐
     * @return
     */
    public static String md5(String credentials, String saltSource){
        ByteSource salt = new Md5Hash(saltSource);
        return new SimpleHash(hashAlgorithmName, credentials, salt, hashIterations).toString();
    }

    /**
     *  获取随机盐
     * @param length 盐长度
     * @return
     */
    public static String getRandomSalt(int length){
        return ToolUtil.getRandomString(length);
    }

    /**
     * 获取当前的Subject
     * @return Subject
     */
    public static Subject getSubject(){
        return SecurityUtils.getSubject();
    }

    /**
     *  获取封装的user
     * @return ShiroUser
     */
    public static ShiroUser getUser(){
        if(isGuest()){
            return null;
        } else {
            return (ShiroUser)getSubject().getPrincipals().getPrimaryPrincipal();
        }
    }

    /**
     * 获取Session
     * @return Session
     */
    public static Session getSession(){
        return getSubject().getSession();
    }

    /**
     * 获取shiro指定的session key
     * @param key
     * @param <T>
     * @return T
     */
    @SuppressWarnings("unchecked")
    public static <T> T getSessionAttr(String key){
        Session session = getSession();
        return session != null ? (T) session.getAttribute(key):null;
    }

    /**
     * 设置shiro sessionkey
     * @param key 键
     * @param value 值
     */
    public static void setSessionAttr(String key, Object value){
        Session session = getSession();
        session.setAttribute(key, value);
    }
    /**
     * 移除sessionkey
     * @param key
     */
    public static void removeSessionAttr(String key){
        Session session = getSession();
        if(session != null){
            session.removeAttribute(key);
        }
    }

    /**
     * 验证当前用户是否有指定权限
     * @param permission 权限名
     * @return 有权限：true 否则：false
     */
    public static boolean hasPermission(String permission){
        return getSubject() != null && permission != null
                &&permission.length() > 0
                &&  getSubject().isPermitted(permission);
    }

    /**
     * 不具备权限
     * @param permission
     * @return 无权限：true 否则：false
     */
    public static boolean lacksPermission(String permission){
        return !hasPermission(permission);
    }

    /**
     * 已认证通过的用户 与notAuhenticated搭配使用
     * @return 认证：true 否则：false
     */
    public static boolean isAuthenticated(){
        return getSubject() != null && getSubject().isAuthenticated();
    }

    /**
     * 未认证通过 与isAuthenticated搭配使用
     * @return 未认证： true 否则：false
     */
    public static boolean notAuthenticated(){
        return !isAuthenticated();
    }

    /**
     * 获取当前用户信息
     * @return 当前用户信息
     */
    public static String  principal(){
        if(getSubject() != null){
            Object principal = getSubject().getPrincipal();
            return principal.toString();
        }
        return "";
    }
/**
 * 占位 判断管理员
 */
//    public static boolean isAdmin(){
//
//    }
//====================================================================================

    /**
     *  认证通过或已经记住的用户，与isGuest搭配使用
     * @return 用户：true 否则： false
     */
    public static boolean isUser(){
        return getSubject() != null && getSubject().getPrincipal() != null;
    }

    /**
     * 是否是访客 未进行认证或认证未通过的用户 搭配isUser
     * @return 访客：true 否则：false
     */
    public static boolean isGuest(){
        return !isUser();
    }

    /**
     * 根据User产生一个ShiroUser对象
     * @return ShiroUser
     */
    public static ShiroUser createShiroUser(){
        return  null;
    }
    /*
    占位 角色判断
     */

    /**
     * 判断用户是否属于以下任一角色
     * @param roleNames 角色列表
     * @return
     */
    public static boolean hasAnyRoles(String roleNames){
        boolean hasAnyRole = false;
        Subject subject = getSubject();
        if(subject != null && roleNames != null && roleNames.length() > 0 ){
            for(String roleName : roleNames.split(NAMES_DELIMETER)){
                if(subject.hasRole(roleName.trim())){
                    hasAnyRole = true;
                    break;
                }
            }
        }
        return hasAnyRole;
    }

    /**
     * 验证用户是否属于以下所有角色
     * @param roleNames 角色列表
     * @return
     */
    public static boolean hasAllRoles(String roleNames) {
        boolean hasAllRole = true;
        Subject subject = getSubject();
        if(subject != null && roleNames != null && roleNames.length() > 0){
            for(String roleName : roleNames.split(NAMES_DELIMETER)){
                if(!subject.hasRole(roleName.trim())){
                    hasAllRole = false;
                    break;
                }
            }
        }
        return hasAllRole;
    }
}
